'use strict';

const fs = require('fs')
const path = require('path')
const Controller = require('egg').Controller
const awaitWriteStream = require('await-stream-ready').write
const sendToWormhole = require('stream-wormhole')
const crypto = require('crypto')

class UploadController extends Controller {
    // 上传单个文件
    async create() {
        const { ctx, service } = this
        // 要通过 ctx.getFileStream 便捷的获取到用户上传的文件，需要满足两个条件：
        // 只支持上传一个文件。
        // 上传文件必须在所有其他的 fields 后面，否则在拿到文件流时可能还获取不到 fields。
        const stream = await ctx.getFileStream()
        // 所有表单字段都能通过 `stream.fields` 获取到
        const filename = path.basename(stream.filename) // 文件名称
        const extname = path.extname(stream.filename).toLowerCase() // 文件扩展名称

        const md5filename = crypto.createHash('md5').update(stream.filename+new Date().getTime(), 'utf8').digest('hex')

        const file = md5filename + extname
        // 组装参数 model
        const attachment = {}
        // 调用 Service 进行业务处理
        attachment.extname = extname
        attachment.filename = md5filename
        attachment.url = `/uploads/${file}`
        // 组装参数 stream
        const target = path.join(this.config.baseDir, 'app/public/uploads', file)
        const writeStream = fs.createWriteStream(target)
        // 文件处理，上传到云存储等等
        try {
            await awaitWriteStream(stream.pipe(writeStream))
        } catch (err) {
            // 必须将上传的文件流消费掉，要不然浏览器响应会卡死
            await sendToWormhole(stream)
            throw err
        }
        const res = await service.upload.create(attachment)

        // 设置响应内容和响应状态码
        // ctx.helper.success({ctx, res})
        ctx.body = {
            code: 0,
            data: res,
            msg: "上传成功"
        }
        ctx.status = 200
    }
    // 删除单个文件
    async destroy() {
        const {
            ctx,
            service
        } = this
        // 校验参数
        const {
            id
        } = ctx.params
        // 调用 Service 进行业务处理
        await service.upload.destroy(id)
        // 设置响应内容和响应状态码
        ctx.body = {
            code: 0,
            msg: "删除成功"
        }
        ctx.status = 200
    }
}

module.exports = UploadController;
